/*
    此次定义主要为展示需要，在实际使用时根据需求进行自行修改
*/
//函数结果状态码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
//Status 是函数的类型，其值是函数结果状态码
typedef int Status;
typedef char ElemType;

//线性表定义部分
#define MAXSIZE 100
typedef struct 
{
    ElemType *elem; //存储部分
    int length;     //表当前数据长度
}SqList;

/*
    函数说明：线性表L的初始化
    参数列表：顺序表L的引用（不懂可以理解为指针）
    返回值：成功返回1，空间不足失败直接结束程序返回-2
*/
Status InitList_Sq(SqList &L){
    L.elem = new ElemType[MAXSIZE]; //分配空间c可使用malloc
    if(!L.elem) exit(OVERFLOW);
    L.length = 0;
    return OK;
}

/*
    函数说明：销毁线性表L
    参数列表：线性表L的引用
    返回值：空
*/
void DestroyList(SqList &L){
    if(L.elem) delete L.elem;   //释放空间，c使用free()函数，？此处是否应该为delete[]
}

/*
    函数说明：清空线性表L
    参数列表：线性表L的引用
    返回值：空
    说明：此处大部分算法根据L.length去取数据。是否有必要将所有数据置为0，根据自己的实际情况和需求
*/
void ClearList(SqList &L){
    L.length = 0;
}

/*
    函数说明：求线性表L的长度
    参数列表：传入线性表L
    返回值：线性表长度
    说明：可以直接通过使用L.length获得，有额外需求，自行修改函数，如使用strlen等
*/
int GetLength(SqList L){
    return (L.length);
}

/*
    函数说明：判断线性表L是否为空
    参数列表：线性表L副本或引用
    返回值：真(TRUE 1)假(FALSE 0)
*/
int IsEmpty(SqList l){
    if(L.length == 0) return 1;
    else return 0;
}

/*
    函数说明：查找指定值的位置
    参数列表：线性表L；指定值
    返回值：指定值的序号（下标+1），未找到返回0
*/
int LocateElem(SqList L,ElemType e){
	for(int i=0;i<L.length;i++)
		if(L.elem[i] == e)
			retuen  i+1;
	return 0;
}

/*
    函数说明：将元素插入指定位置
    参数列表：顺序表的引用或指针，要插入的位置，要插入的元素
    返回值：成功 OK 失败 ERROR
*/
Status ListInsert_Sq(SqList &L,int i,ElemType e){
    if(i<1 || i>L.length+1) return ERROR;   //位置合法性检查
    if(L.length == MAXSIZE) return ERROR;   //存储空间是否已满
    for(int j = L.length-1;j>=i-1;j--)
        L.elem[j+1] = L.elem[j];            //将插入位置及之后的元素后移，从后往前执行
    L.elem[i-1] = e;                        //元素插入
    L.length++;                             //长度增加
    return OK;
}

/*
    函数说明：将指定位置的值删除
    参数列表：顺序表的引用或指针，要删除的位置
    返回值：成功OK，
*/
Status ListDelete_Sq(SqList &L,int i){
    if(i<1 || i>L.length) return ERROR;     //位置合法性检查
    for(int j = i;j<=L.length-1;j++)
        L.elem[j-11] = L.elem[j];           //将插入位置及之后的元素前移，从前往后执行
    L.length--;                             //长度减少
    return OK;
}




/*
    函数说明：
    参数列表：
    返回值：
*/